package com.ykzb.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**
 * des加解密
 * @author wyh
 *
 */
public class DES {

	public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
    
    /**
     * DES算法，加密
     *
     * @param data 待加密字符串
     * @param key  加密私钥，长度不能够小于8位
     * @return 加密后的字节数组，一般结合Base64编码使用
     * @throws InvalidAlgorithmParameterException
     * @throws Exception
     */
    public static String encode(String key,String data) {
        if(data == null)
            return null;
        try{
            DESKeySpec dks = new DESKeySpec(key.getBytes());           
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            //key的长度不能够小于8位字节
            Key secretKey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
            AlgorithmParameterSpec paramSpec = iv;
            cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);          
            byte[] bytes = cipher.doFinal(data.getBytes());           
            return byte2hex(bytes);
        }catch(Exception e){
            e.printStackTrace();
            return data;
        }
    }
 
    /**
     * DES算法，解密
     *
     * @param data 待解密字符串
     * @param key  解密私钥，长度不能够小于8位
     * @return 解密后的字节数组
     * @throws Exception 异常
     */
    public static String decode(String key,String data) {
        if(data == null)
            return null;
        try {
            DESKeySpec dks = new DESKeySpec(key.getBytes());
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            //key的长度不能够小于8位字节
            Key secretKey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
            AlgorithmParameterSpec paramSpec = iv;
            cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
            return new String(cipher.doFinal(hex2byte(data.getBytes())));
        } catch (Exception e){
            //e.printStackTrace();
            return "";
        }
    }
 
    /**
     * 二行制转字符串
     * @param b
     * @return
     */
    private static String byte2hex(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b!=null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1)
                hs.append('0');
            hs.append(stmp);
        }
        return hs.toString().toUpperCase();
    }
     
    private static byte[] hex2byte(byte[] b) {
        if((b.length%2)!=0)
            throw new IllegalArgumentException();
        byte[] b2 = new byte[b.length/2];
        for (int n = 0; n < b.length; n+=2) {
            String item = new String(b,n,2);
            b2[n/2] = (byte)Integer.parseInt(item,16);
        }
        return b2;
    }
    
    public static void main(String args[]) throws UnsupportedEncodingException{
    	String res = DES.decode("heimaoyc","B23E8DBBDDC2D5E9C955C27F30A85342E855122EA439E97E5A29C22C7846785589FBC97FB473A2AE2CDDC0FEA28C40DBC445DDE11368562F10F373F8342FF1708A5E2FAE41165B4E24FCF23D2512591E0C69A7D4EF268F94118D8EFF7B3857AA04B18D61BD38D86800CE8ABEEDF38D34E24C5221A4CAE3D8A29F360284354ECDE196941110C911C773D1F7C16212958356C7AFC7E1A2C377F96425DFC732942AFE680C6C69CA0FCA95D208576D2EC8FA0830C9185CD85A8C8B0915675997BA60B07A0B7039BB64E60ED6DFB8F521C0B8443BB5349FAC189B52EC5E8F1CD74B8F3F96F10A8CB2A14ADB8294D4638D3296A6081C42B699AD3DA177EE1FDC4FEC03131ED89AC472508B6BE05241CEF0EA2A459DACE9A4CF24225A095BC2D009CFA99C5C3A60A248F37A4ED356253F0E7A98F119E9C4223D34F9FF857136F04A9A758C05BB59BBB04367C5916C39250366B2");

    	//String res = DES.encode("heimaoyc",URLEncoder.encode(URLEncoder.encode("{\"code\":\"0\",\"msg\":\"北石家庄中3A广州市123太原\",\"pp\":\"12313245\"}","gbk"),"gbk"));
    	//String res3 = DES.encode("heimaoyc",URLEncoder.encode(URLEncoder.encode("{\"code\":\"0\",\"msg\":\"北石家庄中3A广州市123太原\"}")));
    	System.out.println(URLDecoder.decode(URLDecoder.decode(res,"GBK"),"GBK"));
    	//System.out.println(res3);
    	//String res2 = DES.decode("heimaoyc",res);
    	//System.out.println(res2);

    }
}
